#include "FM175xx.h"
#include "stdbool.h"
#include "string.h"
#include "type_b.h"
#include "stdio.h"

/*****************************************************************************************/
//halt
/*****************************************************************************************/
unsigned char TypeB_Halt(unsigned char *card_sn)
{
	unsigned char  ret,send_byte[5],rece_byte[1],i;
	unsigned int  rece_len;
		FM175xx_SetTimer(10);
		send_byte[0] = 0x50;
		for(i = 0; i < 4; i++)
			{
			send_byte[i + 1] =card_sn[i];
			}
		ret=FM175xx_Comm(Transceive,send_byte,5,rece_byte,&rece_len);
		return (ret);
}
/*****************************************************************************************
名称：TypeB_WUP																		 
功能：TYPE B卡片唤醒																	 
输入：N/A																				 
输出：	rece_len:卡片应答的数据长度；
		buff：卡片应答的数据指针							 
		card_sn:卡片的PUPI字节															 
	   	TRUE：操作成功																	 
		ERROR：操作失败																	 
*****************************************************************************************/
uint8_t TypeB_WUP(uint32_t *rece_len,uint8_t *buff,uint8_t *card_sn)
{						
	uint8_t ret,send_byte[3];

	FM175xx_SetTimer(10);

	send_byte[0]=0x05;//APf
	send_byte[1]=0x00;//AFI (00:for all cards)
	send_byte[2]=0x08;//PARAM(WUP,Number of slots =0)

	ret = FM175xx_Comm(Transceive, send_byte, 3, buff, &(*rece_len));

	if (ret == true)
		memcpy(card_sn, &buff[1], 4);
	
	return (ret);
}
/*****************************************************************************************
名称：TypeB_Select																	 
功能：TYPE B卡片选卡																	 
输入：card_sn：卡片PUPI字节（4字节）													 
输出：	rece_len：应答数据的长度														 
		buff：应答数据的指针															 
	   	TRUE：操作成功																	 
		ERROR：操作失败																	 
*****************************************************************************************/
uint8_t TypeB_Select(uint8_t *card_sn,uint32_t *rece_len,uint8_t *buff)
{
	uint8_t ret,send_byte[9],i;

	FM175xx_SetTimer(20);

	send_byte[0] = 0x1d;
	for(i = 0; i < 4; i++)
	{
		send_byte[i + 1] =card_sn[i];
	}
	send_byte[5] = 0x00;		//------Param1
	send_byte[6] = 0x08;		//01--24，08--256------Param2
	send_byte[7] = 0x01;		//COMPATIBLE WITH 14443-4------Param3
	send_byte[8] = 0x08;		//CID：01 ------Param4
         
	ret = FM175xx_Comm(Transceive, send_byte, 9, buff, &(*rece_len));
	
	return ret;
}
unsigned char TypeB_GetUID(unsigned int *rece_len,unsigned char *buff)
{
	unsigned char ret,send_byte[5];
		FM175xx_SetTimer(15);
		send_byte[0]=0x00;
		send_byte[1]=0x36;
		send_byte[2]=0x00;
		send_byte[3]=0x00;
		send_byte[4]=0x08;
		ret=FM175xx_Comm(Transceive,send_byte,5,buff,&(*rece_len));
		return (ret);
}
/*****************************************************************************************
名称：ReadCard_TypeBActive																	 
功能：TYPE B卡片读卡ID																	 
输入：card_sn：卡片PUPI字节（4字节）													 
输出：	rece_len：应答数据的长度														 
		buff：应答数据的指针															 
	   	TRUE：操作成功																	 
		ERROR：操作失败																	 
*****************************************************************************************/
uint32_t Rec_len;
uint8_t Rec_Data[20];
uint8_t PUPI[4];

unsigned char ReadCard_TypeBActive(unsigned char *csn,unsigned char *csn_len)
{
	uint8_t statues,err = 0;
	Rec_len = 0;            
	
	while(err < 2)		//2次读卡可以有效的减少误读率
	{
		memset((Rec_Data + 1),0,12);
		statues = TypeB_WUP(&Rec_len,(Rec_Data + 1),PUPI);
		if(Rec_len == 0x60)
		{
				statues=TypeB_Select(PUPI,&Rec_len,(Rec_Data + 1));
				if(statues == 1)
				{
					statues=TypeB_GetUID(&Rec_len,(Rec_Data + 1));
					if(statues == 1)
					{
						Rec_Data[0]=Rec_len/8;
						if(Rec_Data[0] == 10)				//有时候会读到不等于10的包 是错误的包
						{
//							csn[0] = *(Rec_Data + 1 + 7);
//							csn[1] = *(Rec_Data + 1 + 6);
//							csn[2] = *(Rec_Data + 1 + 5);
//							csn[3] = *(Rec_Data + 1 + 4);
							memcpy(csn, (Rec_Data + 1), 8);
							*csn_len = 8;
							return 1;
						}
						else
						{
							err++;
						}
					}
					else
					{
						err++;
					}
				}
				else
				{
					err++;
				}
		}
		else
		{
			err++;
		}
	}
	
	return 0;
}
/****************************************************************************************
名称： TypeB_RF_Open																
功能： TypeB_RF_Open打开A类卡天线(无Dely模式)														
输入： 
输出： 
****************************************************************************************/
void TypeB_RF_Open(void)
{
	FM175xx_SoftReset();
	FM175xx_ConfigISOType(ISO_Cfg_TYPE_B);            
	FM175xx_Set_Rf(OPEN_ALL_TX);    
}
/****************************************************************************************
名称： TypeB_RF_Close																
功能： TypeB_RF_Close打开A类卡天线(无Dely模式)														
输入： 
输出： 
****************************************************************************************/
void TypeB_RF_Close(void)
{
	FM175xx_Set_Rf(CLOSE_ALL_TX);
}
